#ifndef GAME_ANIMATION_GAME_ANIMATION_TYPES_H
#define GAME_ANIMATION_GAME_ANIMATION_TYPES_H
//
// Game Animation.
// Copyright (C) 2007 Department of Computer Science, University of Copenhagen
//
#include <animation/configuration.h>

#include <OpenTissue/core/math/noise/noise_improved_perlin.h>
#include <OpenTissue/core/math/math_random.h>
#include <OpenTissue/core/geometry/geometry_aabb.h>

#include <animation/grid/grid_cell.h>
#include <animation/grid/grid_locator.h>
#include <animation/grid/grid.h>
#include <animation/grid/grid_manager.h>
#include <animation/grid/cell_sorting.h>
#include <animation/geometry/geometry_vertex.h>
#include <animation/geometry/geometry.h>

namespace animation
{

  /**
  * The Animation TypeBinder. 
  * Creates all types and bind them together.
  */
  template<typename math_types_>
  class GameAnimationTypes
  {
  public:

    typedef math_types_                     math_types;
    typedef GameAnimationTypes<math_types>  types;

    typedef typename math_types::real_type        real_type;
    typedef typename math_types::vector3_type     vector3_type;
    typedef typename math_types::matrix3x3_type   matrix3x3_type;
    typedef typename math_types::quaternion_type  quaternion_type;
    typedef typename math_types::coordsys_type    coordsys_type;

    typedef int                            index_type;
    typedef OpenTissue::math::Random<real_type>              random_type;
    typedef OpenTissue::noise::ImprovedPerlinNoise<real_type>       noise_type;
    typedef real_type                      vector2_type[2];
    typedef real_type                      vector4_type[4];
    typedef GeometryVertex<types>          vertex_type;
    typedef Geometry<types>                geometry_type;
    typedef GridCell<types>                cell_type;
    typedef Grid<types>                    grid_type;
    typedef GridLocator<types>             grid_locator;
    typedef GridManager<types>             grid_manager;
    typedef CellSorting<types>             cell_sorting;

    typedef OpenTissue::geometry::AABB<math_types>  aabb_type;

  };

} // namespace animation

// GAME_ANIMATION_GAME_ANIMATION_TYPES_H
#endif
